package main

import (
	"fmt"
	"reflect"
)

type Person struct {
	Name string
	age  int32
}

func (p *Person) GetName() string {
	return p.Name
}

func (p *Person) GetAge() int32 {
	return p.age
}

func main() {
	p := Person{
		"allen",
		19,
	}

	v := reflect.ValueOf(&p)
	s := v.Elem()
	typeOfT := s.Type()
	for i := 0; i < typeOfT.NumField(); i++ {
		f := s.Field(i)
		fmt.Printf("%d: %s %s = %v\n", i, typeOfT.Field(i).Name, f.Type(), f)
	}

	for i := 0; i < v.Type().NumMethod(); i++ {
		m := v.Type().Method(i)
		fmt.Printf("%d: %s %s = %v\n", i, m.Name, m.Type, m.Func)
	}

	for i := 0; i < v.NumMethod(); i++ {
		m := v.Method(i)
		fmt.Printf("%d: %s %s = %v\n", i, m.Type(), m, m)
	}
}
